!--------------------------------
! Programa dedicado a abrir um arquivo ('ord_inp.dat')
! carregar uma quantidade de numeros especificada
! e, deles, ordenar outra quantidade especificada.
!
! Programa compilado e testado com:
! $ gfortran -o exec05 exec05.f90
! $ ./exec05
! 
! Forma de utilizacao auto-explicativa
! atravez de comentarios.
!
! _o_o_ oOo _o_o_ 27/08/2010

PROGRAM exec05
  IMPLICIT NONE
  INTEGER :: n, m, foo, bar, thebar
  REAL, DIMENSION(10000) :: nlidos
  REAL, DIMENSION(10000) :: nord
  REAL :: menor, dummy
  write(*,*) "- Entre com 2 inteiros separados por espaco."
  write(*,*) "- O primeiro eh a quantidade de numeros lidos (cuidado para nao pedir mais numeros do que ha no arquivo ord_inp.dat)."
  write(*,*) "- O segundo eh a quantidade de numeros a serem ordenados."
  read(*,*) n,m
  IF (m>n) THEN
    write(*,*) "numero de elementos a serem lidos"
    write (*,*) "menor que o numero de elementos a serem ordenados"
    write(*,*) "Abortando execucao"
    STOP
  END IF
  IF (n>10000) THEN
    write(*,*) "nao podemos tratar mais de 10000 numeros ao mesmo tempo"
    write(*,*) "Abortando execucao"
    STOP
  END IF

  OPEN(11,file='ord_inp.dat')
  foo=1
  DO WHILE (foo<=n)
    read(11,*) nlidos(foo)
    foo=foo+1
  END DO
  write(*,*) "****Vetor de entrada carregado!****"

  !!!!!!!!!!!!!!!
  ! Descomentar para imprimir os numeros de entrada
  !foo=1
  !write(*,*) "numeros escolhidos:"
  !DO WHILE (foo<=n)
  !  write(*,*) nlidos(foo)
  !  foo=foo+1
  !END DO
  !write(*,*) "dos quais ", m, "serao ordenados"
  
  write(*,*) "Iniciando ordenacao."
  foo=1
  DO WHILE (foo<=m)
    bar=1
    thebar=bar
    menor = nlidos(bar)
    ! write(*,*) "menor inicial: ", menor
    DO WHILE (bar<=n-foo)
      bar=bar+1
      dummy = nlidos(bar)
      ! write(*,*) "dummy: ", dummy
      IF (menor > dummy) THEN
        menor = dummy
        thebar = bar
        ! write(*,*) "menor: ", menor
      END IF
    END DO
    ! write(*,*) "menor da rodada achado: ", menor
    nord(foo)=menor
    dummy=nlidos(n+1-foo)
    nlidos(n+1-foo)=nlidos(thebar)
    nlidos(thebar)=dummy
    foo=foo+1
  END DO
  
  foo=1
  write(*,*) "numeros ordenados (no arquivo 'ord_out.dat')."
  open(unit=10,file="ord_out.dat")
  DO WHILE (foo<=m)
    ! write(*,*) nord(foo)
    write(10,*) nord(foo)
    foo=foo+1
  END DO
END PROGRAM
